import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'api_service.dart';
import 'base_service.dart';

/// 用户服务类
class UserService extends GetxService {
  // 存储实例
  late final GetStorage _storage;

  // 存储key常量 - 只持久化核心认证信息
  static const String _keyToken = 'user_token';
  static const String _keyTenantId = 'user_tenant_id';

  /// 用户token
  final _token = Rxn<String>();
  String? get token => _token.value;

  /// 租户ID
  final _tenantId = Rxn<String>();
  String? get tenantId => _tenantId.value;

  /// 用户ID
  final _userId = Rxn<int>();
  int? get userId => _userId.value;

  /// 用户名
  final _userName = Rxn<String>();
  String? get userName => _userName.value;

  /// 手机号
  final _phoneNumber = Rxn<String>();
  String? get phoneNumber => _phoneNumber.value;

  /// 头像URL
  final _picUrl = Rxn<String>();
  String? get picUrl => _picUrl.value;

  /// 是否已登录
  bool get isLoggedIn => _token.value != null;

  @override
  void onInit() {
    super.onInit();
    _storage = GetStorage();
    _loadUserInfo();
  }

  /// 保存登录信息
  void saveLoginInfo(Map<String, dynamic> loginData) {
    final data = loginData['data'] as Map<String, dynamic>?;
    if (data != null) {
      // 保存token
      final token = data['token'] as String?;
      if (token != null) {
        _token.value = token;
      }

      // 保存用户信息
      final userInfo = data['miniUserInfoVO'] as Map<String, dynamic>?;
      if (userInfo != null) {
        _userId.value = userInfo['userId'] as int?;
        _userName.value = userInfo['userName'] as String?;
        _phoneNumber.value = userInfo['phoneNumber'] as String?;
        _tenantId.value = userInfo['tenantId'] as String?;
        _picUrl.value = userInfo['picUrl'] as String?;
      }

      // 持久化保存到本地存储
      _saveToLocal();

      print('用户登录成功: ${_userName.value}');
    }
  }

  /// 清除登录信息
  void clearLoginInfo() {
    _token.value = null;
    _tenantId.value = null;
    _userId.value = null;
    _userName.value = null;
    _phoneNumber.value = null;
    _picUrl.value = null;

    // 清除本地存储
    _clearLocal();

    print('用户登录信息已清除');
  }

  /// 统一的登出处理方法（包含销毁控制器和跳转）
  Future<void> handleLogout({bool callLogoutApi = false}) async {
    try {
      // 如果需要调用退出登录API
      if (callLogoutApi) {
        try {
          final apiService = Get.find<ApiService>();
          await apiService.logout();
        } catch (e) {
          print('调用退出登录API失败: $e');
          // 即使API调用失败也继续执行本地清理
        }
      }

      // 清除登录信息
      clearLoginInfo();

      // 清除BaseService的认证信息
      try {
        final baseService = Get.find<BaseService>();
        baseService.clearAuth();
      } catch (e) {
        print('清除BaseService认证信息失败: $e');
      }

      // 通知所有控制器重新加载数据（重新登录时会用到）
      _notifyDataRefresh();

      // 跳转到登录页面
      Get.offAllNamed('/login');

      print('用户已完全退出登录');
    } catch (e) {
      print('处理登出时出错: $e');
    }
  }

  /// 通知数据刷新（重新登录时使用）
  void _notifyDataRefresh() {
    try {
      print('通知所有控制器数据需要刷新');

      // 设置一个标记，表示需要在下次进入TabBar时刷新数据
      _storage.write('need_data_refresh', true);

      print('已设置数据刷新标记');
    } catch (e) {
      print('设置数据刷新通知时出错: $e');
    }
  }

  /// 检查是否需要刷新数据
  bool shouldRefreshData() {
    try {
      return _storage.read('need_data_refresh') ?? false;
    } catch (e) {
      print('检查数据刷新标记时出错: $e');
      return false;
    }
  }

  /// 清除数据刷新标记
  void clearRefreshFlag() {
    try {
      _storage.remove('need_data_refresh');
      print('已清除数据刷新标记');
    } catch (e) {
      print('清除数据刷新标记时出错: $e');
    }
  }

  /// 检查登录状态
  bool checkLoginStatus() {
    return isLoggedIn;
  }

  /// 获取认证信息用于API请求
  Map<String, String?> getAuthHeaders() {
    return {'Authorization': _token.value, 'x-tenant-id': _tenantId.value};
  }

  /// 从本地存储加载用户信息
  void _loadUserInfo() {
    try {
      _token.value = _storage.read(_keyToken);
      _tenantId.value = _storage.read(_keyTenantId);

      if (isLoggedIn) {
        print('从本地存储加载认证信息成功');
      } else {
        print('未找到本地登录信息');
      }
    } catch (e) {
      print('加载用户信息失败: $e');
    }
  }

  /// 保存到本地存储
  void _saveToLocal() {
    try {
      _storage.write(_keyToken, _token.value);
      _storage.write(_keyTenantId, _tenantId.value);
      print('认证信息保存到本地存储成功');
    } catch (e) {
      print('保存认证信息失败: $e');
    }
  }

  /// 清除本地存储
  void _clearLocal() {
    try {
      _storage.remove(_keyToken);
      _storage.remove(_keyTenantId);
      print('本地存储的认证信息已清除');
    } catch (e) {
      print('清除认证信息失败: $e');
    }
  }
}
